﻿#ifndef OPTIONWIDGET_H
#define OPTIONWIDGET_H

#include <QObject>
#include <QWidget>
#include <QList>
#include <QPair>
#include <QHBoxLayout>
#include <QScrollArea>

#include "ENUM/enum.h"
#include "ui/optionWidget/optionsItem/optionItemFrame.h"
#include "ui/optionWidget/optionsItem/optionItemMiddleWidget/cameraMiddleWidget.h"
#include "ui/optionWidget/optionsItem/optionItemMiddleWidget/cameraNumSetting.h"
#include "ui/optionWidget/optionsItem/optionItemMiddleWidget/showSetting.h"
#include "ui/optionWidget/optionsItem/optionItemMiddleWidget/VideoImage.h"

/*
 * 这里对所有属于optionWidget中的子控件均进行统一管理
 */

//用于标识当前optionItemFrame属于哪个菜单项
enum optionKind{
    CameraKind = 0,             // 相机按钮
    ShowKind = 1,               // 显示按钮
    SettingKind = 10            // 设置按钮
};

class optionWidget : public QWidget
{
    Q_OBJECT
public:
    explicit optionWidget(QWidget *parent = nullptr);
    /**
     @interpret 传入需要显示的对应组件，不需要显示的就隐藏
     @param     showItem表示需要显示的组件
     @return    true-成功;false-失败
     */
    bool setItemShow(optionKind showItem);

    int optionWidth(ParameterKind kind = ParameterKind::Get, int width = 0);

    /**
     @interpret 设置当前组件的背景颜色与字体颜色
     @param     backgroundColor: 背景颜色；fontColor: 字体颜色
     @return    true-成功;false-失败
     */
    bool setBackgroundColor(const QColor& backgroundColor, const QColor& fontColor);
    /**
     @interpret     用于初始化option区域的所有语言（初始化为翻译源：中文）
     */
    void optionLanguageInit();

    cameraMiddleWidget *RCameraWidget();                                    //返回相机中心部件  但是这样不利于解耦
private:
    //optionWidget中子组件对象
    // camera组件
    optionItemFrame<cameraMiddleWidget> *m_CameraFrame;           // 相机组件
    cameraMiddleWidget *m_CameraMiddle;                           // 相机组件的中心Widget
    // cameraNumSetting组件
    optionItemFrame<CameraNumSetting> *m_CameraNumSettingFrame;   // 相机参数设置组件
    CameraNumSetting *m_CameraNumSetting;
    // showSetting组件
    optionItemFrame<ShowSetting> *m_ShowSettingFrame;             // 显示设置组件
    ShowSetting* m_ShowSetting;
    // videoIamge组件
    optionItemFrame<VideoImage> *m_VideoImageFrame;               // 录制视频获取照片组件
    VideoImage* m_VideoImage;

    QVBoxLayout* m_VLayout;           // optionWidget中的垂直布局
    QWidget*     m_SpaceWidget;       // 占位控件
    QWidget*     m_VisibleWidget;     // 将所有子组件添加到该QWidget中
    QScrollArea* m_Scroll;            // 滚动条
    QHBoxLayout* m_HLayout;           // optionWidget布局

private:
     QList<QPair<optionItem* , optionKind>> m_Frames;    // 保存组件的父类指针，到后面根据其optionKind
     int m_OptionWidgetWidth = 320;
private slots:
     void sendercameraChange(const QString& text);
     void senderFlushCamera();
signals:
    void cameraChange(const QString&);
    void flushCamera();
    void setSignalValue(signalKind, int);                         // 向上层发送该信号
};

#endif // OPTIONWIDGET_H
